package com.qf.commerce.utils;

import com.github.pagehelper.PageInfo;
import org.springframework.beans.BeanUtils;
import org.springframework.util.ObjectUtils;

import java.util.List;
import java.util.Objects;
import java.util.function.Supplier;
import java.util.stream.Collectors;

public class CommonBeanUtils extends BeanUtils {
    /**
     * 拷贝指定源列表 到 指定目标bean类型，并返回目标bean列表
     *
     * @param targetClazz 目标bean 类型
     * @param sourceList  源bean 列表
     * @param <T>         指目标bean类型
     * @param <D>         指代源bean类型
     * @return 返回指定目标bean类型的列表
     */
    @Deprecated
    public static <T, D> List<T> copyForList(List<D> sourceList, Class<T> targetClazz) {
        if (Objects.isNull(sourceList) || Objects.isNull(targetClazz)) {
            return null;
        }
        return sourceList.stream().filter(Objects::nonNull).map(d -> {
            T t = null;
            try {
                //使用反射构建对象
                t = targetClazz.newInstance();
            } catch (InstantiationException | IllegalAccessException e) {
                e.printStackTrace();
            }
            if (Objects.nonNull(t)) {
                BeanUtils.copyProperties(d, t);
            }
            return t;
        }).filter(Objects::nonNull).collect(Collectors.toList());
    }

    /**
     * 拷贝指定源列表 到 指定目标bean类型，并返回目标bean列表
     * copyForList(sources,CartsVO::new)
     *
     * @param targetSupplier 目标bean对象提供者
     * @param sourceList     源bean 列表
     * @param <T>            指目标bean类型
     * @param <D>            指代源bean类型
     * @return 返回指定目标bean类型的列表
     */
    public static <T, D> List<T> copyForList(List<D> sourceList, Supplier<T> targetSupplier) {
        if (Objects.isNull(sourceList) || Objects.isNull(targetSupplier)) {
            return null;
        }
        return sourceList.stream().filter(Objects::nonNull).map(d ->
                        CommonBeanUtils.copyForBean(d, targetSupplier))
                .filter(Objects::nonNull).collect(Collectors.toList());
    }

    /**
     * 拷贝指定bean 到目标bean
     * 用法：
     * copyForBean( useDo,UserDto::new);
     */
    public static <T, D> T copyForBean(D d, Supplier<T> targetSupplier) {
        if (ObjectUtils.isEmpty(targetSupplier) || ObjectUtils.isEmpty(d)) {
            return null;
        }
        T t = targetSupplier.get();
        BeanUtils.copyProperties(d, t);
        return t;
    }

    /**
     * 转化Page对象
     * <p>
     * Page<Carts>  page1  ---->  Page<CartsVo> page2
     * List<Carts>   sources      List<CartsVo>
     * <p>
     * Page<CartsVo> cartsVoPage = CommonBeanUtils.copyPage(cartsPage, new Page<CartsVo>(), CartsVo::new);
     *
     * @return
     */
    public static <T, S> PageInfo<S> copyPage(PageInfo<T> sources, PageInfo<S> page, Supplier<S> target) {
        // 先复制Page属性的值
        copyProperties(sources, page);
        List<S> list = copyForList(sources.getList(), target);
        page.setList(list);
        return page;
    }
}